home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / smaltalk / manchest.lha / MANCHESTER / manchester / 4.1 / Interface-Clocks.st < prev    next >
Text File  |  1993-07-24  |  7KB  |  241 lines

  1. "    NAME        Interface-Clocks
  2.     AUTHOR        Bernard Horan <bernard@is.morgan.com>
  3.     CONTRIBUTOR    Bernard Horan <bernard@is.morgan.com>
  4.     FUNCTION      Clocks
  5.     ST-VERSIONS    4.1
  6.     PREREQUISITES     
  7.     CONFLICTS     
  8.     DISTRIBUTION    world
  9.     VERSION        1.1
  10.     DATE        September 1992
  11.     SUMMARY        A category of clocks. Re-implementation (almost) of clocks from VI2.3 for new release. Bernard Horan, 25/9//92"!
  12. View subclass: #ClockView
  13.     instanceVariableNames: 'myProject date '
  14.     classVariableNames: ''
  15.     poolDictionaries: ''
  16.     category: 'Interface-Clocks'!
  17. ClockView comment:
  18. ' I''m an abstract superclass for clockViews. In true O-O fashion I am the result of
  19. an abstraction of existing (VI2.3) classes -- see my subclasses.
  20. Instance variables:
  21.       myProject                       <project> the project I''m open in and,
  22.         date                            <date> the date I have in my label
  23.  
  24. Bernard Horan
  25. 29 June 1992'!
  26.  
  27.  
  28. !ClockView methodsFor: 'initialize'!
  29.  
  30. initialize
  31.         "set up the view's constants"
  32.  
  33.         super initialize.
  34.         myProject := Project current.
  35.         date := Date today! !
  36.  
  37. !ClockView methodsFor: 'controller access'!
  38.  
  39. defaultControllerClass
  40.         ^ClockController! !
  41.  
  42. !ClockView methodsFor: 'displaying'!
  43.  
  44. displayOn: aGraphicsContext 
  45.     "called from the outside, check the date and update the time."
  46.  
  47.     | today |
  48.     today := Date today.
  49.     date = today
  50.         ifFalse: 
  51.             [date := today.
  52.             self topComponent newLabel: today].
  53.     self topComponent isCollapsed ifFalse: [self displayTimeOn: aGraphicsContext]! !
  54.  
  55. ClockView subclass: #AClockView
  56.     instanceVariableNames: ''
  57.     classVariableNames: ''
  58.     poolDictionaries: ''
  59.     category: 'Interface-Clocks'!
  60. AClockView comment:
  61. 'I am the view of the ASCII clock - I display the date in my top component''s label  and display the time in my insides.
  62.  
  63. Amended from the VI2.3 version.
  64. Bernard Horan, 29 June 1992'!
  65.  
  66.  
  67. !AClockView methodsFor: 'displaying'!
  68.  
  69. displayTimeOn: aGraphicsContext
  70.         "update the time in the view with now's string"
  71.  
  72.         | str text |
  73.         str := Time now printString.
  74.         str := str copyFrom: 1 to: (str size - 6).       "remove seconds"
  75.         (text := str asComposedText)
  76.                 displayOn: aGraphicsContext
  77.                 at: (self bounds center - text bounds center)      "put up the string"! !
  78. "-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- "!
  79.  
  80. AClockView class
  81.     instanceVariableNames: ''!
  82. AClockView class comment:
  83. 'I am the view of the ASCII clock - I hold the date in my label tab and display the time in my insides.
  84.  
  85. My instance variables are:
  86.         <myProject> the project i''m open in and,
  87.         <date> the date i have in my label'!
  88.  
  89.  
  90. !AClockView class methodsFor: 'instance creation'!
  91.  
  92. open
  93.     "open an ASCII clock view and start the controller."
  94.     "AClockView open"
  95.  
  96.     | topView insideView |
  97.     topView := ScheduledWindow new.
  98.     topView label: Date today printString.
  99.     topView minimumSize: 'XX:XX' asComposedText bounds corner + (32 @ 8).    "Magic Numbers... (system and nt dependent)"
  100.     insideView := self new.
  101.     topView component: insideView.
  102.     topView open! !
  103.  
  104. ClockView subclass: #GClockView
  105.     instanceVariableNames: ''
  106.     classVariableNames: 'NumberForms '
  107.     poolDictionaries: ''
  108.     category: 'Interface-Clocks'!
  109. GClockView comment:
  110. 'I am the view of the graphical clock - I display the date in my top component''s
  111. label  and display the time in my insides like a graphical clock.
  112.  
  113. Amended from VI2.3
  114. Bernard Horan,
  115. 29 June 1992'!
  116.  
  117.  
  118. !GClockView methodsFor: 'displaying'!
  119.  
  120. displayFaceOn: aGraphicsContext 
  121.     "generate the background face form"
  122.  
  123.     | radius center extent |
  124.     center := self bounds center.
  125.     extent := self bounds extent.
  126.     radius := extent // 2 - 12.
  127.     1 to: 12
  128.         do: 
  129.             [:number | 
  130.             | degree direction form |
  131.             degree := number - 3 * 30.
  132.             direction := degree degreesToRadians cos @ degree degreesToRadians sin.
  133.             form := NumberForms at: number.
  134.             form displayOn: aGraphicsContext at: center + 1 + (direction * radius) - (form bounds center).
  135.             aGraphicsContext displayRectangle: (center + (direction * (radius - 11)) extent: 2 @ 2)]!
  136.  
  137. displayHandsOn: aGraphicsContext 
  138.     "display the hands of the clock. This is where the fancy stuff is..."
  139.  
  140.     | x y radius center extent time hour minute |
  141.     extent := self bounds extent.
  142.     center := self bounds center.
  143.     radius := extent // 2 - 20.
  144.     time := Time now.
  145.     minute := time minutes.
  146.     hour := time hours * 5 + (minute / 12) asFloat.
  147.     x := (hour * 6 - 90) degreesToRadians cos.
  148.     y := (hour * 6 - 90) degreesToRadians sin.
  149.     aGraphicsContext lineWidth: 4.
  150.     aGraphicsContext displayLineFrom: center + (x @ y * radius // 2) to: center.
  151.     aGraphicsContext lineWidth: 2.
  152.     x := (minute * 6 - 90) degreesToRadians cos.
  153.     y := (minute * 6 - 90) degreesToRadians sin.
  154.     aGraphicsContext displayLineFrom: center + (x @ y * (radius - 8)) to: center!
  155.  
  156. displayTimeOn: aGraphicsContext 
  157.     "do the updating of the view"
  158.  
  159.     self displayFaceOn: aGraphicsContext.
  160.     self displayHandsOn: aGraphicsContext! !
  161. "-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- "!
  162.  
  163. GClockView class
  164.     instanceVariableNames: ''!
  165. GClockView class comment:
  166. 'I am the view of the graphical clock - I hold the date in my label tab and lay the time in my insides like a graphical clock.
  167. I am not constrained to being square.
  168.  
  169. My instance variables are:
  170.         cacheForm <Form> the bitmap of the numbers for the face of the clock,
  171.         cacheBox <rectangle> the box (i.e., self insetDisplayBox) that the face lives in,
  172.         myProject <project> the project i''m open in and,
  173.         date <date> the date i have in my label'!
  174.  
  175.  
  176. !GClockView class methodsFor: 'instance creation'!
  177.  
  178. open
  179.     "open a new GClockView by executing the following comment"
  180.     "GClockView open"
  181.  
  182.     | topView insideView |
  183.     topView := ScheduledWindow new.
  184.     topView label: Date today printString.
  185.     topView minimumSize: 100 @ 100.
  186.     insideView := self new.
  187.     topView component: insideView.
  188.     topView open! !
  189.  
  190. !GClockView class methodsFor: 'class initialization'!
  191.  
  192. initialize
  193.     "initialize the class constants"
  194.     "GClockView initialize"
  195.  
  196.     NumberForms := Array new: 12.
  197.     1 to: 12
  198.         do: 
  199.             [:number | 
  200.             | text |
  201.             text := number printString asText allBold asComposedText.
  202.             NumberForms at: number put: text]! !
  203.  
  204. ControllerWithMenu subclass: #ClockController
  205.     instanceVariableNames: 'clockProcess '
  206.     classVariableNames: ''
  207.     poolDictionaries: ''
  208.     category: 'Interface-Clocks'!
  209. ClockController comment:
  210. 'I am the controller for clock views.  I set up the process that updates the ck every minute.'!
  211.  
  212.  
  213. !ClockController methodsFor: 'initialize-release'!
  214.  
  215. initialize
  216.         "start the process to update the clock every minute.
  217.         One might want to make this less frequent (like every 3 minutes)."
  218.  
  219.         super initialize.
  220.         clockProcess := 
  221.                 [[(Delay forSeconds: 60) wait.
  222.                         view invalidate. 
  223.                         true] whileTrue] 
  224.                 newProcess.
  225.         clockProcess resume!
  226.  
  227. release
  228.         "stop the update process."
  229.  
  230.         clockProcess terminate! !
  231.  
  232. !ClockController methodsFor: 'control activity'!
  233.  
  234. isControlActive
  235.         "am i awake?"
  236.  
  237.         ^super isControlActive & sensor blueButtonPressed not! !
  238. GClockView initialize!
  239.  
  240.  
  241.